package fejezet20;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Foltosodás extends JApplet
    implements ActionListener {
  private JButton btFoltosodás=new JButton("Foltosodás");
  private JPanel pnSejttér=new JPanel();
  private final int N=300;
  private char[][] sejt=new char[N+2][N+2];
  private Graphics vászon;

  @Override
  public void init() {
    setSize(300, 330);
    add(btFoltosodás, BorderLayout.NORTH);
    btFoltosodás.addActionListener(this);
    add(pnSejttér, BorderLayout.CENTER);
  }

  public void actionPerformed(ActionEvent e) {
    sejttér();
    szimuláció();
  }

  private void sejttér() {
    for(int i=0; i<=N+1; i++) {
      sejt[i][0]='F';
      sejt[i][N+1]='F';
    }
    for(int j=0; j<=N+1; j++) {
      sejt[0][j]='F';
      sejt[N+1][j]='F';
    }
    for(int i=1; i<=N; i++)
      for(int j=1; j<=N; j++)
        if(Math.random()<0.5)
          sejt[i][j]='A';
        else
          sejt[i][j]='B';
    vászon=pnSejttér.getGraphics().create(1, 1, N, N);
    vászon.clearRect(1, 1, N, N);
    for(int i=1; i<=N; i++)
      for(int j=1; j<=N; j++) {
        switch(sejt[i][j]) {
          case 'A': vászon.setColor(Color.YELLOW); break;
          case 'B': vászon.setColor(Color.BLUE);
        }
        vászon.drawOval(i, j, 1, 1);
      }
  }

  private void szimuláció() {
    for(int lépés=1; lépés<=10000000; lépés++)
      szimulációsLépés();
  }

  private void szimulációsLépés() {
    int i=(int)(Math.random()*N+1);
    int j=(int)(Math.random()*N+1);
    int szomszédAdb=szomszédSzám(i, j, 'A');
    int szomszédBdb=szomszédSzám(i, j, 'B');
    switch(sejt[i][j]) {
      case 'A': if(szomszédAdb<=szomszédBdb) {
                  sejt[i][j]='B';
                  vászon.setColor(Color.BLUE);
                  vászon.drawOval(i, j, 1, 1);
                }
                break;
      case 'B': if(szomszédAdb>=szomszédBdb) {
                  sejt[i][j]='A';
                  vászon.setColor(Color.YELLOW);
                  vászon.drawOval(i, j, 1, 1);
                }
    }
  }

  private int szomszédSzám(int i, int j, char c) {
    int db=0;
    for(int sor=i-1; sor<=i+1; sor++)
      for(int oszlop=j-1; oszlop<=j+1; oszlop++)
        if(sor!=i || oszlop!=j)
          if(sejt[sor][oszlop]==c)
            db++;
    return db;
  }
}